package com.test.concurrency;
import java.util.concurrent.TimeUnit;

/**
 * create threads with inner classes
 * 
 * @author Administrator
 * 
 */
class InnerThread1 {
	private int countDown = 5;
	private Inner inner;

	public InnerThread1(String name) {
		inner = new Inner(name);
	}

	private class Inner extends Thread {

		Inner(String name) {
			super(name);
			start();
		}

		@Override
		public void run() {

			try {
				while (true) {
					System.out.println(this);
					if (--countDown == 0)
						return;
					sleep(10);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
}

// using an anonymous inner class
class InnerThread2 {
	private int countDown = 5;
	private Thread t;
	public InnerThread2(String name) {
		t = new Thread(name) {
			public void run() {
				try {
					while (true) {
						System.out.println(this);
						if (--countDown == 0)
							return;
						sleep(10);
					}
				} catch (Exception e) {
					System.out.println("Sleep() iterrupted");
				}
			}
			public String toString(){
				return getName()+": "+countDown;
			}
		};
		t.start();
	}
}
//using a named Runnable implementation

class InnerRunnable1{
	private int countDown =5;
	private Inner inner;
	public InnerRunnable1(String name){
		inner = new Inner(name);
	}
	
	private class Inner implements Runnable{
		Thread t;
		Inner(String name){
			t = new Thread(this,name);
			t.start();
		}
		@Override
		public void run() {
			try {
				while (true) {
					System.out.println(this);
					if (--countDown == 0)
						return;
					TimeUnit.MILLISECONDS.sleep(10);
				}
			} catch (Exception e) {
				System.out.println("Sleep() iterrupted");
			}
			
		}
		public String toString(){
			return t.getName() +": "+countDown;
		}
	}
}
//using an anonymous Runnable implementation
class InnerRunnable2{
	private int countDown =5;
	private Thread t;
	public InnerRunnable2(String name){
		t = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					while (true) {
						System.out.println(this);
						if (--countDown == 0)
							return;
						TimeUnit.MILLISECONDS.sleep(10);
					}
				} catch (Exception e) {
					System.out.println("Sleep() iterrupted");
				}
				
			}
			public String toString(){
				return Thread.currentThread().getName()+": "+countDown;
			}
		},name);
		t.start();
	}
}
public class ThreadVariations {
	
	public static void main(String[] args){
		new InnerThread1("InnerThread1");
		new InnerThread2("InneThread2");
		new InnerRunnable1("InnerRunnable1");
		new InnerRunnable2("InnerRunnable2");
	}

}
